#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <sys/time.h>
#include <unistd.h>
#include "timer.h"

// 全局变量，用于保存用户传入的任务函数指针
static task_func_t global_task = NULL;

// SIGALRM 信号处理函数，在定时器到期时调用
static void sigalrm_handler(int sig)
{
    (void)sig;  // 避免编译器警告
    if (global_task) {
        global_task();
    }
}

/**
 * 启动定时器接口，使用 setitimer 实现
 */
int start_setitimer(long interval_ms, task_func_t task, int loop_flag)
{
    struct sigaction sa;
    struct itimerval timer;

    // 保存用户的任务函数到全局变量
    global_task = task;

    // 设置 SIGALRM 信号处理函数
    memset(&sa, 0, sizeof(sa));
    sa.sa_handler = sigalrm_handler;
    sigemptyset(&sa.sa_mask);
    if (sigaction(SIGALRM, &sa, NULL) < 0) {
        perror("sigaction error");
        return -1;
    }

    // 配置定时器初始时间
    timer.it_value.tv_sec = interval_ms / 1000;
    timer.it_value.tv_usec = (interval_ms % 1000) * 1000;
    if (loop_flag) {
        // 循环定时器：重复间隔与初始时间相同
        timer.it_interval = timer.it_value;
    }
    else {
        // 一次性定时器：不重复
        timer.it_interval.tv_sec = 0;
        timer.it_interval.tv_usec = 0;
    }

    if (setitimer(ITIMER_REAL, &timer, NULL) < 0) {
        perror("setitimer error");
        return -1;
    }

    return 0;
}

void stop_setitimer(void)
{
    struct itimerval timer = {0};
    setitimer(ITIMER_REAL, &timer, NULL);
}

// Demo: 如果需要演示定时器功能，可以定义宏 DEMO_TIMER_UTIL 来编译 main 函数
#ifdef DEMO_TIMER_UTIL
#    include <time.h>
#    include "log.h"
void demo_task(void)
{
    print_current_time();
}

int main(void)
{
    // 启动定时器，每隔 1000 毫秒（1 秒）执行 demo_task，循环执行
    if (start_setitimer(100, demo_task, 1) != 0) {
        fprintf(stderr, "Failed to start timer\n");
        exit(EXIT_FAILURE);
    }

    // 主线程等待信号触发任务
    while (1) {
        pause();
    }
    return 0;
}
#endif
